简体   繁体   中英

Promise does not resolve node.js

I am trying to resolve some promises by the sendRequest function but it does not work.

For example, if I evoke sendRequest function 4 times, all of the times, I can see the log printed in the console and then going to resolve(data) . But only 1 out of 4 times, the program reaches in to sendRequest.then() .

Here is the complete code of that file.

change-name.js

var sendRequest = function(fileName){
    return new Promise(function (resolve,reject) {
        httpRequest(fileName).then(function (data) {
            try{
                if(.....){
                    if(.....){
                        var lastIndex = ....;}
                    if(.....){
                        var lastIndex = ....;}
                    str = fileName.substring(0, lastIndex);
                    if(.........){
                        sendRequest(str);}
                    else{
                        reject("this is the end");}
                    }
                else{
                    console.log("end result" + JSON.stringify(data,null,4));
                    resolve(data);
                    //===== THIS RESOLVE DOES NOT WORK WHILE THE LOG PRINTS THE DATA =====//
                    }
                }
            catch(e){
                resolve(data);
                }
        }).catch(function (err) {
            reject(err);
        });
    });
};

server.js

this files calls the sendRequest function from the change-name.js and the then method is applied here for that function.

fs.readdir(path,(err,files)=>{
    if(err){
        console.log(err);
        return;
        }
    for(i=0;i<files.length;i++){
        sendRequest(files[i]).then(function (data) {
        console.log(data + "\n");
    }).catch(function(err){
        console.log("end Error is " + err + "\n");
    });
    console.log(files);
  }
});

The github link is " https://github.com/abhikulshrestha22/movierator ".

Any help would be appreciated. Thanks

The problem is that one of your branches calls sendRequest again rather than resolving or rejecting, but then doesn't make any use of the promise the recursive call returns returns, so the promise you created for the outer call is never resolved. The inner one is (which is why you see the message in the console), but since nothing is using that promise, you don't get the result you expect.

There's also no need for new Promise in your code at all. httpRequest already gives you a promise, and your then handler on it creates a promise (if you return a value). So sendRequest should just return the result of calling then on httpRequest 's promise, and within the then callback, either return the value to resolve the new promise with, or throw to reject. In the branch where you're calling sendRequest again, return the promise it returns; the one then creates will then resolve/reject based on that promise:

var sendRequest = function(fileName) {
    return httpRequest(fileName).then(function(data) {
        if (condition1) {
            if (condition2) {
                var lastIndex = something;
            }
            if (condition3) {
                var lastIndex = somethingElse;
            }
            str = fileName.substring(0, lastIndex);
            if (condition4) {
                return sendRequest(str);
            }
            else {
                throw new Error("this is the end");
            }
        }
        else {
            console.log("end result" + JSON.stringify(data, null, 4));
            return data;
        }
    });
};

Here's a live example where httpRequest returns a random number 1-10, and if the number is less than 8, calls sendRequest again; it'll try up to three times before giving up:

 function httpRequest() { return new Promise(function(resolve) { setTimeout(function() { resolve(Math.floor(Math.random() * 10) + 1); }, 500); }); } var sendRequest = function(fileName, retries) { if (typeof retries !== "number") { retries = 3; } return httpRequest(fileName).then(function(data) { console.log("`then` got: " + data); if (data > 7) { console.log("It's > 7, yay! We're done"); return data; } console.log("It's <= 7g"); if (--retries === 0) { console.log("Out of retries, rejecting"); throw new Error("out of retries"); } console.log("retrying (" + retries + ")"); return sendRequest(fileName, retries); }); }; document.getElementById("btn").addEventListener("click", function() { var btn = this; btn.disabled = true; console.log("Sending request"); sendRequest("foo") .then(function(data) { console.log("Request complete: " + data); }) .catch(function(err) { console.log("Request failed: " + err); // Because we don't throw here, it converts the rejection into a resolution... }) .then(function() { // ...which makes this kind of like a "finally" btn.disabled = false; }); }, false); 
 <input type="button" id="btn" value="Start"> 

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM