JavaScript承诺 - 如何做出多重承诺?

时间:2016-10-26 16:11:08

标签: javascript express promise es6-promise

如何将多重承诺链接起来?例如:

var promise = new Promise(function(resolve, reject) {

    // Compose the pull url.
    var pullUrl = 'xxx';

    // Use request library.
    request(pullUrl, function (error, response, body) {
        if (!error && response.statusCode == 200) {
            // Resolve the result.
            resolve(true);
        } else {
            reject(Error(false));
        }
    });

});

promise.then(function(result) {

    // Stop here if it is false.
    if (result !== false) {
        // Compose the pull url.
        var pullUrl = 'xxx';

        // Use request library.
        request(pullUrl, function (error, response, body) {
            if (!error && response.statusCode == 200) {
                resolve(body); // <-- I want to pass the result to the next promise.
            } else {
                reject(Error(false));
            }
        });
    }

}, function(err) {
    // handle error
});

promise.then(function(result) {

    // Stop here if it is false.
    if (result !== false) {
        // handle success.
        console.log(result);
    }
}, function(err) {
    // handle error.
});

错误:

  

解析(机构);       ReferenceError:未定义resolve

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

当链接Promises时,那么从给定的函数返回值应该是Promise,或者是要传递的值。

在您的情况下,由于您正在进行异步通话,因此您只需返回其他承诺并在其中调用rejectresolve。如果它不是异步的,你可以只返回值,或抛出一个错误,它也会被传递给下一个错误或错误处理程序/ catch。

此外,您需要将它们链接在一起,因为每个then()都返回一个不同的Promise。

所以,像这样:

var promise = new Promise(function(resolve, reject) {

    // Compose the pull url.
    var pullUrl = 'xxx';

    // Use request library.
    request(pullUrl, function (error, response, body) {
        if (!error && response.statusCode == 200) {
            // Resolve the result.
            resolve(true);
        } else {
            reject(Error(false));
        }
    });

});

promise.then(function(result) {

    // Stop here if it is false.
    if (result !== false) {
        var airportCode = result;

        // Compose the pull url.
        var pullUrl = 'xxx';

        // Use request library.
        return new Promise(function (resolve, reject) {
            request(pullUrl, function (error, response, body) {
                if (!error && response.statusCode == 200) {
                    resolve(body);
                } else {
                    reject(Error(false));
                }
            });
        });
    }

}).then(function(result) {
    // Stop here if it is false.
    if (result !== false) {
        // handle success.
        console.log(result);
    }
}).catch(function (err) {
  // handle error
});

这是一个带有工作版本的JSFiddle:JSFiddle