2016-04-21 2 views
0

Я пытаюсь следовать «когда» пример на Parse JavaScript SDK: Parse.Promise со следующим кодом:Анализировать Promise «когда» возвращает неопределенное значение (Javascript)

GetFromDB2 = function(id) { 
    var DB2 = Parse.Object.extend("DB2"); 
    var q = new Parse.Query(DB2); 
    q.get(id, { 
     success: function(res) { 
      return Parse.Promise.as(10); 
     }, 
     error: function(res, err) { 
      console.log(err); 
     } 
    }); 
} 

GetData = function() { 
    var DB1 = Parse.Object.extend("DB1"); 
    var query = new Parse.Query(DB1); 
    query.equalTo("param", "close"); 

    query.find().then(function(results) { 
     var promises = []; 
     _.each(results, function(res) { 
      promises.push(GetFromDB2(res.get("user"))); 
     }); 

     Parse.Promise.when(promises).then(function() { 
      console.log(arguments); // expect: [10, 10, ...] 
     }) 
    }); 
}; 

Длина массива аргументы является правильным, но не знаю, почему его значения не определены.

+1

Предполагая, что это должно быть 'return q.get' ... – mido

ответ

0

Как написано, GetFromDB2() возвращает undefined. Чтобы доставить значение, он должен вернуть либо значение, либо обещание.

В самом простом, чтобы доставить 10, вы могли бы написать:

function GetFromDB2(id) { 
    return 10; 
} 

Но быть асинхронными, и по-прежнему обеспечивают 10, вам необходимо вернуть обещание, что будет решать 10:

function GetFromDB2(id) { 
    return Parse.Promise.as(10); 
} 

или .get(id) запрос, который вы действительно хотите:

function GetFromDB2(id) { 
    var DB2 = Parse.Object.extend('DB2'); 
    var q = new Parse.Query(DB2); 
    return q.get(id).then(function(res) { 
     return 10; 
    }); 
    //omit `.then(...)` entirely to deliver `res` 
} 

Теперь GetData() можно записать следующим образом:

function GetData() { 
    var DB1 = Parse.Object.extend('DB1'); 
    var query = new Parse.Query(DB1); 
    query.equalTo('param', 'close'); 
    return query.find().then(function(results) { 
     var promises = _.map(results, function(res) { 
      return GetFromDB2(res.get('user')); 
     }); 
     Parse.Promise.when(promises).then(function() { 
      console.log(arguments); // expect: [10, 10, ...] 
     }, function(err) { 
      console.log(err); 
      return err; 
     }); 
    }); 
}; 

Примечания:

  • promises = _.map(...) более элегантно, чем _.each(...) плюс `promises.push (...).
  • перемещение обработчика ошибок в GetData() позволяет обрабатывать больший диапазон возможных ошибок, например ошибку, возникающую из query.find().
  • По возвращении обещания, получатель GetData() также информируется о возможном асинхронном исходе.
Смежные вопросы