Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么';这个承诺通过的测试不通过吗?_Javascript_Node.js_Asynchronous_Promise_Bluebird - Fatal编程技术网

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,你最好看一下,而不是单独承诺。我已经尝试过使用
。一些
,但在负载测试期间遇到了一些问题。好的,谢谢你的后续评论,我想我最好在有一个问题直接解决我的问题后再问另一个问题:)向你投票!:)