使用deferred.resolve(value)返回到我的.then()的值是未定义的

时间:2016-03-23 23:07:43

标签: javascript node.js asynchronous q deferred

我使用Q.js在我的主函数

中调用api使用两个循环
    for i..10
     for i...5
         var promise = getLoc(x,y);
         promise.then(function(value) {
             //value is undefined...
         }

在我的getLoc函数中,我有

    function getLoc(x,y) {
      var value;
      var deferred = Q.defer();
      Q.ninvoke(request, 'get', {

      }).spread(function(response, body) {
        value = body;
      });

      defferred.resolve(value);
      return deferred.promise
    }

为什么传递给then函数的值没有定义?我如何通过我的解决价值?谢谢!

1 个答案:

答案 0 :(得分:3)

您必须在异步回调中调用resolve(),因为将来某个时候会调用该回调,因此这是该值唯一已知的位置:

function getLoc(x,y) {
  var deferred = Q.defer();
  Q.ninvoke(request, 'get', {  // ... other options here
  }).spread(function(response, body) {
     deferred.resolve(body);
  });

  return deferred.promise;
}

您试图在异步回调被调用之前返回该值,因此始终是undefined

或者,因为Q.ninvoke()似乎返回了一个承诺,你可以这样做并避免使用常见的延迟反模式:

function getLoc(x,y) {
  return Q.ninvoke(request, 'get', {  // ... other options here
  }).spread(function(response, body) {
     return body;
  });
}