Javascript 在节点中使用承诺循环返回相同的响应

Javascript 在节点中使用承诺循环返回相同的响应,javascript,node.js,promise,q,Javascript,Node.js,Promise,Q,使用q时,我得到的响应与它循环的次数相同: function start() { var the_promises = []; var api_info = config.AFV var deferred = Q.defer(); var extPath = '/search/' var callType = 'GET' var mymd = buildmd5(api_info, extPath, callType); for(var p

使用q时,我得到的响应与它循环的次数相同:

function start() {
    var the_promises = [];
    var api_info = config.AFV
    var deferred = Q.defer();
    var extPath = '/search/'
    var callType = 'GET'
    var mymd = buildmd5(api_info, extPath, callType);

    for(var page=1;page<4;page++) {

        console.log('getting page:'+page)
        new Client().get(url'+page, function(data, response){
            deferred.resolve(data);
        });
        the_promises.push(deferred.promise);
    }  
    return Q.all(the_promises);
}

start().then(function (clips) {
    inspect(clips)
});
函数开始(){
var_承诺=[];
var api_info=config.AFV
var deferred=Q.deferred();
var extPath='/search/'
var callType='GET'
var mymd=buildmd5(api_info,extPath,callType);

对于(var page=1;page,您需要为每个新客户机创建一个新的延迟。并将该循环体放入一个立即调用的函数中,以正确地确定var的范围

function start() {
    var the_promises = [];
    var api_info = config.AFV;
    var extPath = '/search/';
    var callType = 'GET';
    var mymd = buildmd5(api_info, extPath, callType);

    for(var page=1;page<4;page++) {
        (function() {
            var deferred = Q.defer();
            console.log('getting page:'+page);
            new Client().get('url'+page, function(data, response){
                deferred.resolve(data);
            });
           the_promises.push(deferred.promise);
        }());
    }  
    return Q.all(the_promises);
}

start().then(function (clips) {
    inspect(clips);
});
函数开始(){
var_承诺=[];
var api_info=config.AFV;
var extPath='/search/';
var callType='GET';
var mymd=buildmd5(api_info,extPath,callType);

对于(var page=1;page我不喜欢现有的解决方案,这是有风险的。如果一个承诺出错会发生什么?如果代码中有另一个问题会发生什么

我的建议是始终承诺尽可能低的原语

在我们的例子中,我会推荐
客户机
s
.get
方法

Client.prototype.getAsync = function(url){
   var d = Q.defer(); // or better, using Q.Promise(
   // please also consider adding a d.reject on the error case.
   this.get(url, function(data){ d.resolve(data); }); 
   return d.promise;
}
此新api允许您执行以下操作:

var promises = [1,2,3,4].map(function(page){
    return new Client().getAsync("url"+page);
});
return Q.all(promises);

然后得到一个与Dan的答案类似的API。在我看来,这是一个更好的API,并且更不容易出错。

Move
var deferred=Q.deferred()在循环内部。
如果您有多个
承诺
,则需要多个
延迟
对象。您正在对所有承诺重复使用相同的
延迟
,这很可能是问题的原因。啊,工作得很好!谢谢!