gpt4 book ai didi

javascript - 等待 promise - 代码挂起

转载 作者:太空宇宙 更新时间:2023-11-04 02:57:52 28 4
gpt4 key购买 nike

我第一次使用 Javascript Promises,遇到了一些我不明白的事情。

我想做的是创建一个验证阶段,该阶段运行并检查事物 - 最终等待所有 promise 得到解决。

为此,我创建了一个验证 promise :

 validate = function(data) {
var p = new Promise(function(resolve, reject)){

在这里,我为我将要做的所有不同事情定义了一个 Promise 数组:

         var all_promises = Array();

现在执行类似 Sequelize 调用的操作,同时将 Promise 添加到此数组中(Sequelize 返回 Promise):

         all_promises.push(resBooking);
resBooking.count(...).then(...).catch(...);

我的日志记录表明我们已经度过了难关,一切都很顺利。现在我需要做的就是等待!

        Promise.all(all_promises).then(function(){
p.resolve();
});

但是这个愚蠢的事情挂起了 - 它等待某些事情完成。没有 CPU 使用率。我做错了什么?

最佳答案

你想要的是

validate = function(data) {
var p = new Promise(function(resolve, reject)){
var all_promises = Array();
all_promises.push(resBooking);
resBooking.count(...).then(...).catch(...);

Promise.all(all_promises).then(resolve);
});
return p;
};

换句话说,调用resolve,而不是p.resolve()p.resolve 将生成一个运行时错误(p 不存在),该错误将被 Promise 构造函数“吞噬”并导致其失败。但是,您甚至无法从外部看到被拒绝的 promise ,因为您也没有从函数中返回它。

但是,尽管此代码现在应该可以工作,但您仍然犯了“ promise 构造函数反模式”。当您已经拥有 Promise.all 形式的 Promise 时,您无需构建新的 Promise。所以你可以直接写

validate = function(data) {
var all_promises = Array();
all_promises.push(resBooking);
resBooking.count(...).then(...).catch(...);
return Promise.all(all_promises);
};

不过,我不确定上面的内容是否正是您想要的。我不知道 resBooking 是什么,或者 resBooking.count。无论如何,您将等待 resBooking promise ,而不是等待您挂起的 thencatch 的结果。根据您想要实现的目标,您可能想要

validate = function(data) {
var all_promises = Array();
all_promises.push(resBooking.count(...).then(...).catch(...));
return Promise.all(all_promises);
};

关于javascript - 等待 promise - 代码挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31006589/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com