JavaScript承诺-如何做出多个承诺

JavaScript Promise - how to make multiple promise?

本文关键字:承诺 何做出 JavaScript      更新时间:2023-09-26

如何链接多个承诺?例如:

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 is not defined

任何想法?

链接Promise时,函数的返回值要么是Promise,要么是要传递的值。

在您的情况下,因为您正在进行异步调用,您将返回另一个承诺并在其中调用rejectresolve。如果它不是异步的,你可以直接返回值,或者抛出一个错误,这个错误也会被传递给下一个then或错误处理程序/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