2015-11-01 97 views
0

與此問題類似:Return response from async call 除了該調用在多次調用異步函數的循環中。如何返回多個異步調用的響應?

具體來說,s值如何返回?此代碼返回未定義。這個函數在for循環中被調用。用於ORM的庫是Bookshelfjs。謝謝您的幫助。

function getUsernameFromDBAsync(userId) { 
    var s = "moo"; 

    new Model.Users({ 
      idUser: userId 
     }) 
     .fetch() 
     .then(function(u) { 
      var prenom = u.get('firstName'); 
      var nom = u.get('familyName'); 
      s = prenom + " " + nom; 
      return s; 
     }); 
} 
+0

是否使用一個承諾庫?或節點4? – jmunsch

+1

無論是一個還是多個都不重要,你需要回調太處理數據,不能返回數據,顧名思義它是異步的。 – vinayakj

+0

我正在使用節點4.我試過promisejs。 – Xc43

回答

1

你並沒有真正展示你如何做循環,這使得它有點難以猜測推薦什麼。不過,假設.fetch().then()回報的承諾,這裏是與內置到Node.js的標準ES6承諾總體思路:

function getUsernameFromDBAsync(userId) { 
    var s = "moo"; 

    return new Model.Users({ 
     idUser: userId 
    }).fetch().then(function (u) { 
     var prenom = u.get('firstName'); 
     var nom = u.get('familyName'); 
     s = prenom + " " + nom; 
     return s; 
    }); 
} 

var userIds = [...]; 
var promises = []; 
for (var i = 0; i < userIds.length; i++) { 
    promises.push(getUsernameFromDBAsync(userIds[i])); 
} 

// now set up a .then() handler for when all the promises are done 
Promise.all(promises).then(function(names) { 
    // process names array here 
}, function(err) { 
    // process error here 
}); 

如果您使用的是藍鳥承諾庫,你可以做一點點更簡單地說是這樣的:

function getUsernameFromDBAsync(userId) { 
    var s = "moo"; 

    return new Model.Users({ 
     idUser: userId 
    }).fetch().then(function (u) { 
     var prenom = u.get('firstName'); 
     var nom = u.get('familyName'); 
     s = prenom + " " + nom; 
     return s; 
    }); 
} 

var userIds = [...]; 
Promise.map(userIds, getUsernameFromDbAsync).then(function(names) { 
    // process names array here 
}, function(err) { 
    // process error here 
}); 
0

var s是不必要的。只需從成功回調中返回「prénomnom」字符串即可。

function getUsernameFromDBAsync(userId) { 
    return new Model.Users({ 
     idUser: userId 
    }).fetch().then(function (u) { 
     return u.get('firstName') + ' ' + u.get('familyName'); 
    }); 
} 

你的「循環」可以用Array.prototype.map()實現產生承諾的數組,然後Promise.all(promises).then(...),接收和處理名稱的數組時,所有承諾已經解決。

var promises = userIds.map(function(userId) { 
    return getUsernameFromDBAsync(userId); 
}); 
Promise.all(promises).then(function(names) { 
    // do something with `names`, which is an array of `prénom nom` strings. 
}, function(err) { 
    // handler error, eg ... 
    console.error(error); 
}); 

或者更簡潔地說:

Promise.all(userIds.map(getUsernameFromDBAsync)).then(function(names) { 
    // do something with `names`, which is an array of `prénom nom` strings. 
}, function(err) { 
    // handler error, eg ... 
    console.error(error); 
});