2016-03-23 1 views
0

Я использую Q.js для вызова АНИ использовать две петли следующим образом в моей главной функцииВозвращаемое значение с помощью deferred.resolve (значение) на мой .then() не определено

for i..10 
    for i...5 
     var promise = getLoc(x,y); 
     promise.then(function(value) { 
      //value is undefined... 
     } 

В моей getLoc функции I имеют

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, не определено? Как передать мое разрешенное значение? Благодаря!

+0

Просто избежать [отложенные антипаттерн] (http://stackoverflow.com/q/23803743/1048572), и проблема уйдет сама по себе! – Bergi

+1

Возможный дубликат [Resolve обещает один за другим (то есть в последовательности)?] (Http://stackoverflow.com/questions/24586110/resolve-promises-one-after-another-ie-in-sequence) –

+0

Это правильное поведение , В тот момент, когда вы вызываете 'defferred.resolve (value),' 'значение' undefined. –

ответ

2

Вы должны вызвать 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; 
    }); 
} 
+0

Надеюсь, вы идентифицировали его как антипаттерн, и он уже работает над правильным решением ... – Bergi

+0

Хорошо, я судил, что вы немного знали о обещаниях, и они в основном все одинаковы :-) [Bluebird docs on 'spread '] (http://bluebirdjs.com/docs/api/spread.html)? – Bergi

+1

@ Bergi - Я добавил лучший способ. Я не знаю Q и не собираюсь его изучать, поэтому я только сначала сделал очевидную ошибку, но теперь я вижу, что, по-видимому, 'Q.ninvoke()' возвращает обещание, чтобы его можно было просто вернуть. – jfriend00