parsing嵌套的承诺?

我试图查找与input数组中的电话号码匹配的用户。 不过,我相信response.success(friends); 在用户查询完成之前调用。 与我目前的数据,这应该返回2个用户,但是,因为它是目前写入它只返回一个空的数组。 如果我把userQuery中的成功响应(简单地testing),我得到一个用户回来,所以我知道查询是正确的。 我需要另一个嵌套的承诺吗?

 Parse.Cloud.define("addFriends", function(request, response) { var _ = require('underscore.js'); Parse.Cloud.useMasterKey(); var friends=[]; var theNumbers = request.params.phoneNumbers; var userId = request.params.user; var currentUserQuery = new Parse.Query("User"); currentUserQuery.equalTo("objectId", userId) currentUserQuery.first().then(function(currentUser) { var promise = Parse.Promise.as(); _.each(theNumbers, function(aNumber) { promise = promise.then(function() { console.log('looking for: ' + aNumber); userQuery = new Parse.Query("User"); userQuery.equalTo("phoneNumber", aNumber); userQuery.first().then(function(foundUser){ console.log("Found user: " + foundUser); friends.push(foundUser); }); }); return promise; }); }).then(function(){ console.log('done'); response.success(friends); }); }); 

将所有子承诺添加到数组朋友中,并返回一个新的承诺Parse.Promise.whenresponse.success需要返回arguments因为Parse.Promise.when每个参数而不是数组返回一个结果。

 Parse.Cloud.define("addFriends", function(request, response) { var _ = require('underscore.js'); Parse.Cloud.useMasterKey(); var friends=[]; var theNumbers = request.params.phoneNumbers; var userId = request.params.user; var currentUserQuery = new Parse.Query("User"); currentUserQuery.equalTo("objectId", userId) currentUserQuery.first().then(function(currentUser) { _.each(theNumbers, function(aNumber) { console.log('looking for: ' + aNumber); userQuery = new Parse.Query("User"); userQuery.equalTo("phoneNumber", aNumber); friends.push(userQuery.first()); }); return Parse.Promise.when(friends); }).then(function(){ console.log('done'); response.success(arguments); }); }); 

您需要返回承诺才能进行下一个。然后等待解决。

 Parse.Cloud.define("addFriends", function(request, response) { var _ = require('underscore.js'); Parse.Cloud.useMasterKey(); var friends=[]; var theNumbers = request.params.phoneNumbers; var userId = request.params.user; var currentUserQuery = new Parse.Query("User"); currentUserQuery.equalTo("objectId", userId) currentUserQuery.first().then(function(currentUser) { var promise = Parse.Promise.as(); _.each(theNumbers, function(aNumber) { promise = promise.then(function() { console.log('looking for: ' + aNumber); userQuery = new Parse.Query("User"); userQuery.equalTo("phoneNumber", aNumber); userQuery.first().then(function(foundUser){ console.log("Found user: " + foundUser); friends.push(foundUser); }); }); return promise; }); // This is where you return the promise, to delay the call to response.success return promise; }).then(function(){ console.log('done'); response.success(friends); }); });