2016-07-08 3 views
1

Я использую модуль request-prom и не нашел упоминания о том, как запросить цепочку. Я в настоящее время после их синтаксис:Цепочки запросов с использованием BlueBird/Request-Promise

request({options}) 
    .then(function(result){...}) 
    .catch(function(error){...}) 

Однако я хочу, чтобы иметь возможность использовать Promise.all и попытаться сделать несколько звонков одновременно и ждать их всех решимостью, а затем продолжить с другими вызовами , Например, я хочу:

  1. Позвонить в одно приложение, создав пользователя.
  2. В одно и то же время сделайте вызов, создав адрес.
  3. Promise.all ([UserCall, AddressCall]). Then ({функция для решения результатов])?

Также я работал с моей функцией в module.exports = {...}. Это требует от меня быть вне экспорта и объявлять их как отдельные переменные?

Из того, что я понимаю его, кажется, как будто я должен сделать что-то вроде:

var UserCall = function(req,res){ 
    return new Promise(function (resolve, reject){ 
    request({options})? //To make the call to create a new user? 
    // Then something with resolve and reject 

Любая помощь очень ценится. Я думаю, что я могу смешивать основные концепции BlueBird и пытаться использовать их с обещанием.

+0

Да, просто используйте 'Promise.all ([запрос ({...}), запрос ({...})])'. в чем именно проблема?: Что вы пробовали? – Bergi

+0

Нет, вы не должны использовать конструктор 'new Promise', если' request (...) 'уже возвращает обещание – Bergi

+0

Я попытался использовать' Promise.all ([запрос ({...}), request ({...})]). затем (функция (результаты) {...}) '. Однако по некоторым причинам я получаю нулевые или неопределенные результаты из 2 запросов. Я сделал несколько консольных журналов, и кажется, что функция .then не ждет возвращения результатов. Я должен положить '.then (function (result) {return result})' для каждого 'request ({...})'? – Jeff

ответ

-1

Как вы сказали, вы можете выполнить это, используя API all.

Обратитесь к документации здесь: http://bluebirdjs.com/docs/api/promise.all.html

Пример:

var self = this; 
    return new Promise(function(resolve) { 
     Promise.all([self.createUser, self.createAddress])done(
      // code path when all promises are completed 
      // OR should any 1 promise return with reject() 
      function() { resolve(); } 
     ); 
    }) 

Как отмечалось в коде, путь кода .all() обратного вызова будет вызвана, как хорошо, когда какой-либо один из определенного обещания в promises получает отклонение.

+0

Как сказал @Bergi, вы не должны создавать новые обещания. Просто вызовите 'Promise.all (self.createUser(), self.createAddress()) .then (...)' – Arnial

+0

Я сейчас делаю 'Promise.all ([request ({...}), request ({... })]), затем (function (result) {...}). catch (function (err) {...}) ', но я запускаю null или undefined resullts из 2 запросов, как указано в моем комментарии выше. – Jeff

+0

'Promise.all' принимает массив, а не несколько параметров – Bergi

2

Здесь вы идете:

var BPromise = require('bluebird'); 
var rp = require('request-promise'); 

BPromise.all([ 
    rp(optionsForRequest1), 
    rp(optionsForRequest2) 
]) 
    .spread(function (responseRequest1, responseRequest2) { 
     // Proceed with other calls... 
    }) 
    .catch(function (err) { 
     // Will be called if at least one request fails. 
    }); 
Смежные вопросы