Javascript 我保证,一切都不会回来
我一直在尝试获得承诺。所有的承诺都没有成功,所以我尝试了一系列的承诺,但我得到了同样的问题:Javascript 我保证,一切都不会回来,javascript,promise,ecmascript-6,es6-promise,Javascript,Promise,Ecmascript 6,Es6 Promise,我一直在尝试获得承诺。所有的承诺都没有成功,所以我尝试了一系列的承诺,但我得到了同样的问题: let tasks = []; tasks.push(function(resolve, reject){ superagent .post(URL_ROOT + url_path) .send(data) .end(function(err, res){ if(err) reject(err);
let tasks = [];
tasks.push(function(resolve, reject){
superagent
.post(URL_ROOT + url_path)
.send(data)
.end(function(err, res){
if(err)
reject(err);
assert.equal(res.status, status.UNAUTHORIZED); //401
console.log('Promise completed successfully');
resolve();
});
});
Promise.all([
new Promise(tasks[0])
]).then( function(){
console.log("Done");
done();
})
.catch( function(reason){
throw new Error(reason);
});
“Promise completed successfully”打印得很好,但它只是挂起,“Done”从未打印过
非常感谢您的帮助。查看节点处理程序:
.end(function(err, res){
if(err)
reject(err);
assert.equal(res.status, status.UNAUTHORIZED); //401
console.log('Promise completed successfully');
resolve();
});
如果出现错误(且评估成功),这将同时调用拒绝
和解决
。我怀疑在您的情况下会出现这种情况,因此承诺会被拒绝(因为在解析之前会调用拒绝),代码将继续并打印成功完成的承诺
之后,承诺链运行到拒绝处理程序:
.catch( function(reason){
throw new Error(reason);
});
但是这段代码没有做任何事情,因为抛出一个承诺延续将转化为结果承诺中的拒绝,这个承诺在这里被遗忘了
尝试以下方法验证我的理论,并查看它是否记录:
.catch( function(reason){
console.log("Promise rejected");
throw new Error(reason);
});
要解决此问题,您所要做的就是稍微重新构造代码:
.end(function(err, res){
if(err) {
reject(err);
} else {
resolve();
assert.equal(res.status, status.UNAUTHORIZED); //401
console.log('Promise completed successfully');
}
});
因此,您已经将异步任务转换为适当的承诺(可能还必须处理.on(“error”,reason=>reject(reason))
),并在catch子句中放置一个错误处理程序
如果仍要将错误传递给全局错误处理程序,最好在setTimeout
中执行此操作,以便promise回调无法捕获和转换错误:
.catch( function(reason) {
setTimeout(() => {
throw new Error(reason);
}, 0);
});
查看节点处理程序:
.end(function(err, res){
if(err)
reject(err);
assert.equal(res.status, status.UNAUTHORIZED); //401
console.log('Promise completed successfully');
resolve();
});
如果出现错误(且评估成功),这将同时调用拒绝
和解决
。我怀疑在您的情况下会出现这种情况,因此承诺会被拒绝(因为在解析之前会调用拒绝),代码将继续并打印成功完成的承诺
之后,承诺链运行到拒绝处理程序:
.catch( function(reason){
throw new Error(reason);
});
但是这段代码没有做任何事情,因为抛出一个承诺延续将转化为结果承诺中的拒绝,这个承诺在这里被遗忘了
尝试以下方法验证我的理论,并查看它是否记录:
.catch( function(reason){
console.log("Promise rejected");
throw new Error(reason);
});
要解决此问题,您所要做的就是稍微重新构造代码:
.end(function(err, res){
if(err) {
reject(err);
} else {
resolve();
assert.equal(res.status, status.UNAUTHORIZED); //401
console.log('Promise completed successfully');
}
});
因此,您已经将异步任务转换为适当的承诺(可能还必须处理.on(“error”,reason=>reject(reason))
),并在catch子句中放置一个错误处理程序
如果仍要将错误传递给全局错误处理程序,最好在setTimeout
中执行此操作,以便promise回调无法捕获和转换错误:
.catch( function(reason) {
setTimeout(() => {
throw new Error(reason);
}, 0);
});
这没有道理。如果打印了“Promise completed successfully”,那么也应该打印“Done”。请注意,如果您的断言抛出,您的承诺将永远不会被拒绝,
catch
回调毫无意义(它可能会调用Done
并出现错误)@Bergi我必须承认我不会像这样列出我的承诺,并将承诺直接添加到任务数组中。但是OP说他得到了“承诺成功完成”
,所以断言虽然错了,但这里不可能是问题所在,因为resolve肯定也会受到打击。去掉超级药剂对我来说确实有用。OP是否可能使用了某些特定的Promise库,但这些库工作不正常?@Keith是的,断言不是问题的原因,我只是想指出它是错误的。事实上,最好将承诺本身放在任务数组中,这没有意义。如果打印了“Promise completed successfully”,那么也应该打印“Done”。请注意,如果您的断言抛出,您的承诺将永远不会被拒绝,catch
回调毫无意义(它可能会调用Done
并出现错误)@Bergi我必须承认我不会像这样列出我的承诺,并将承诺直接添加到任务数组中。但是OP说他得到了“承诺成功完成”
,所以断言虽然错了,但这里不可能是问题所在,因为resolve肯定也会受到打击。去掉超级药剂对我来说确实有用。OP是否可能使用了某些特定的Promise库,但这些库工作不正常?@Keith是的,断言不是问题的原因,我只是想指出它是错误的。事实上,最好将承诺本身放在任务数组中。啊,谢谢,它现在可以工作了:)我没有意识到拒绝后会继续执行,或者如果未经授权,err不为null。此外,断言和日志应该放在然后处理程序中,不在解析器回调中。Crikey昨天有一个,有人假设一个reject(),使函数短路。另一个选项当然是if(err)return-reject(err)代码>我知道这是个人偏好,只是它可以防止大量的if-then-else缩进。啊,谢谢,它现在可以工作了:)我没有意识到拒绝后会继续执行,或者如果未经授权,err不为null。此外,断言和日志应该放在then
处理程序中,不在解析器回调中。Crikey昨天有一个,有人假设一个reject(),使函数短路。另一个选项当然是if(err)return-reject(err)代码>我知道这是个人偏好,只是它防止了大量的if-then-else缩进。