【问题标题】:resolving a javascript promise解决一个 javascript 承诺
【发布时间】:2016-12-28 11:07:55
【问题描述】:

下面概述了一个承诺,它有两个简单的步骤,在控制台上显示一些内容,然后在第一步完成后显示其他内容。

我正在尝试了解如何解决承诺,并允许第二步完成。

var lookup_documents = new Promise(
    function(resolve, reject) {
        console.log("1st");
        //resolve(); - How do I do this outside of this function?
    }

);

lookup_documents.then(
    function() {
        console.log("2nd");
    }
);

【问题讨论】:

标签: javascript promise resolve


【解决方案1】:

当你想将一些异步函数包装到一个 Promise 中时,通常使用new Promise(),例如:

new Promise((resolve, reject) => {
    makeAjaxCall((err, data) => {
        if(err) return reject(err);
        else return resolve(data);
    })
});

还有其他 Promise 实现,例如 q,您可以在其中创建一个返回 Promise 的“延迟”对象......类似的东西是:

function makeAjaxCallPromise() {
    let deferred = Q.defer();
    makeAjaxCall((err, data) => {
        if(err) return deferred.reject(err);
        else return deferred.resolve(data);
    });
    return deferred.promise;
}

对于您想要的特定内容...我能想到的就是在 promise 函数范围之外声明一个变量并对其进行赋值,例如:

let resolver, rejecter;
new Promise((resolve, reject) => {
    resolver = resolve;
    rejecter = reject;
});
makeAjaxCall((err, data) => {
    if(err) return resolver(err);
    else return rejecter(data);
});

但这看起来不太好,并且可能导致错误...尝试将所有内容包装在您的 Promise 函数中。

【讨论】:

    【解决方案2】:

    你可以这样做,使用你的例子 - 如果我理解正确的话。

    var lookup_documents = function() {
      return new Promise(function(resolve, reject) {
        console.log("1st");
        resolve();
      });
    };
    
    lookup_documents().then(function() {
      console.log("2nd");
    });
    

    【讨论】:

    • 这很完美,效果很好。为了进一步澄清,我试图在执行 API 调用的承诺的第一部分中调用一个函数,并希望在 API 完成后(在单独的函数中)解析承诺的第一部分。
    • 你搞清楚了吗?否则我可以用一个解决方案来改变我的答案。
    • 我接受了上面的建议,将 API 放在了 Promise 的第一部分,然后在 API 调用完成后解决它。为了启动 API 调用,我使用此处提供的第二段代码以及插入的命令,以根据承诺的第一部分的成功解析来执行。 - 谢谢,这让我很开心!
    • 当然,我很想给你荣誉,我该怎么做?我没怎么用过这个板。
    猜你喜欢
    • 1970-01-01
    • 2016-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多