2016-11-16 7 views
-2

Я не могу использовать обещание в цикле. Мне нужно последовательно получать завершение метода reqWithPromiseКак использовать обещание для цикла в моем случае

getUserInfoById:() -> 
    ids = [196658162, 244668541, 84634196, 1234567, 45367181] 
    last = Promise.resolve() 
    for id of ids 
    id = ids[id] 
    url = "https://api.vk.com/method/users.get?fields=photo,status&user_ids=#{id}&access_token=#{atom.config.get('vk-messenger.apiToken')}&v=5.60" 
    last = last.then(() -> reqWithPromise(url)); 

reqWithPromise = (url) -> 
    https.get url, (@response) -> 
    @response.on 'data', (chunk) -> 
     @userModel = JSON.parse(chunk)['response'][0] 
     console.log @userModel.id + ' ' + @userModel.first_name 

я получил

5 times: 45367181 Daniil 
+1

Возможный дубликат [Закрытие Область охвата не захвачена? - Coffeescript] (http://stackoverflow.com/questions/11996218/closure-scope-not-captured-coffeescript) –

ответ

0

Вы можете использовать reduce и обещает, чтобы получить ваши вызовы будут обрабатываться последовательно:

getUserInfoById:() -> 
    ids = [196658162, 244668541, 84634196, 1234567, 45367181] 
    ids.reduce((memo, id)-> 
    # Check that the previous promise is resolved 
    memo.then -> 
     url = "https://api.vk.com/method/users.get?fields=photo,status&user_ids=#{id}&access_token=#{atom.config.get('vk-messenger.apiToken')}&v=5.60" 
     # Call next promise func. 
     reqWithPromise(url) 
    , Q()) #First memo value is a promise 

reqWithPromise = (url) -> 
    # should return a promise 
    deferred = Q.defer() 
    https.get url, (@response) -> 
    @response.on 'data', (chunk) -> 
     @userModel = JSON.parse(chunk)['response'][0] 
     console.log @userModel.id + ' ' + @userModel.first_name 
     deferred.resolve(@userModel) 
    deferred.promise 
Смежные вопросы