Javascript 为什么';这个承诺通过的测试不通过吗?
几天前,我步入了一个充满承诺的美好世界,我只是觉得自己开悟了。承诺看起来很简单,但可能令人困惑 你能告诉我为什么下面的考试不及格吗Javascript 为什么';这个承诺通过的测试不通过吗?,javascript,node.js,asynchronous,promise,bluebird,Javascript,Node.js,Asynchronous,Promise,Bluebird,几天前,我步入了一个充满承诺的美好世界,我只是觉得自己开悟了。承诺看起来很简单,但可能令人困惑 你能告诉我为什么下面的考试不及格吗 var Promise = require('bluebird'); var expect = require('chai').expect; var request = Promise.promisifyAll(require('request')); describe('Promise', function() { it('should work ag
var Promise = require('bluebird');
var expect = require('chai').expect;
var request = Promise.promisifyAll(require('request'));
describe('Promise', function() {
it('should work again', function() {
var final_result;
function first_promise() {
return new Promise(function(resolve, reject) {
resolve("http://www.google.com");
})
}
function second_promise() {
return new Promise(function(resolve, reject) {
resolve("This is second promise!");
})
}
function inner_async_request(url_from_first_promise) {
return new Promise(function(resolve, reject) {
return request.getAsync(url_from_first_promise).spread(function(response, content) {
final_result = content;
resolve(content);
})
})
}
return request.getAsync('http://127.0.0.1:3000/').spread(function(result, content) {
//do something with content and then return first_promise
console.log(content);
return first_promise;
})
.then(function(url) {
inner_async_request(url).then(function(result) {
console.log(result);
final_result = result;
})
return second_promise;
})
.then(function(result) {
// result should be "This is second promise!"
console.log(result);
// final_result should be google's html
expect(final_result).not.to.be.undefined;
})
});
});
当前的错误是:未处理的拒绝错误:options.uri是一个必需的参数
,我想应该从first\u promise
接收它
实际上,通过这个测试,我想了解如何使用相互依赖的承诺,以及如何将承诺作为承诺中的异步函数使用——承诺应该单独工作
谢谢您需要调用函数来返回承诺,如
return request.getAsync('http://localhost:3000/').spread(function(result, content) {
//do something with content and then return first_promise
console.log(content);
return first_promise();
})
在某些情况下,你根本不需要做出新的承诺
例如
function inner_async_request(url_from_first_promise) {
return request.getAsync(url_from_first_promise).spread(function(response, content) {
final_result = content;
return content;
})
}
最后,为了使测试正常工作,您还需要修改它
.then(function(url) {
// return
return inner_async_request(url).then(function(result) {
console.log(result);
final_result = result;
return second_promise(); // return second promise inside then
})
})
你是在用你的实际代码呼叫
first\u promise
?您返回时仍需先拨打电话\u promise
。请勿使用!谢谢你推荐Bergi!我曾看过你的那篇文章,但不太好,现在我更明白了。但还不是最好的。更好:)是的,考试通过了,但我还是有些担心。在这个解决方案中,不是返回second_promise()代码>依赖于内部异步请求()的执行。
?我希望内部异步请求以异步方式独立执行。是的,在代码中它独立运行。但你不能预测什么时候会解决,只要它没有被某种方式链接,因此最终结果
。因此expect(最终结果).not.to.be.undefined代码>可能总是失败。我希望这是有意义的。那么,我要找的东西的正确方式是什么呢?我希望在我仍然设置要解决的父承诺时完成一个异步作业,该作业应该在后台运行,而不会阻止当前承诺。在这种情况下,由于您使用的是Bluebird,你最好看一下,而不是单独承诺。我已经尝试过使用。一些,但在负载测试期间遇到了一些问题。好的,谢谢你的后续评论,我想我最好在有一个问题直接解决我的问题后再问另一个问题:)向你投票!:)