2017-02-09 5 views
2

Я хочу избежать Адвокатов Обратного вызова, поэтому я основал обещание, но я немного застрял.Как сделать 3 звонка, используя обещание Метеор

мне нужно сделать getAllDataSource ->createDashboard -> `sendDashboard``

Так код:

var call = Promise.promisify(Meteor.call, Meteor); 

var calls = call(getAllDataSource()). 
      then(call.bind(Meteor, createDashboard())). 
      then(call.bind(Meteor, sendDashboard())); 

calls.then(function(resThree){ 
    console.log("Got Response!", resThree); 
}).catch(function(err){ 
    console.log("Got Error", err); 
}); 

Но я немного потерял с первым вар call я думаю, что нужно изменить его, но с чем? И тогда, как это будет известно, когда будет сделано getAllDataSource?

var allDataSources; 
getAllDataSources = Meteor.bindEnvironment(function(){ 
    HTTP.call("GET", 'http://localhost:3000/api/datasources', { 
      headers: { 
       'Accept': 'application/json', 
       'Content-Type': 'application/json', 
       'Authorization': 'Bearer eyJrIjoic2RRbU9oM2Rkbmc0bHZUSjVlTjBPckRVNlplSW1DYzEiLCJuIjoibG9jYWxob3N0X2FkbWluX2tleSIsImlkIjoxfQ==', 
      }, 
     }, 
     function(error, result) { 
      if (!error) { 
       allDataSources = result.data; 
      } else { 
       console.error(error); 
      } 
     }); 
}); 

var sendme; 
createDashboard = Meteor.bindEnvironment(function(){ 
    for (var i = 0; i < 5; i++) { 
    console.log("I have " + i + " apples in " + allDataSources); 
    sendme = "hihihih"; 
    } 
}); 

sendDashboard = Meteor.bindEnvironment(function(){ 
    for (var i = 0; i < 7; i++) { 
    console.log("I have " + i + " cats with " + sendme); 
    } 
}); 

Он автоматически переходит к методу 2 при создании результата?

Спасибо за помощь

[EDIT] На самом деле это дает мне, что на консоли:

Got Error { [Error: Method 'undefined' not found [404]] 
I20170209-10:39:30.990(1)? error: 404, 
I20170209-10:39:30.991(1)? reason: 'Method \'undefined\' not found', 
I20170209-10:39:30.991(1)? details: undefined, 
I20170209-10:39:30.991(1)? message: 'Method \'undefined\' not found [404]', 
I20170209-10:39:30.991(1)? errorType: 'Meteor.Error' } 

[EDIT2] После последовавшей за ответ @ymz я получил эту ошибку:

Got Error { [Error: Method '[object Object],[object Object],[object Object],[object Object]' not found [404]] 
I20170209-11:23:48.154(1)? error: 404, 
I20170209-11:23:48.154(1)? reason: 'Method \'[object Object],[object Object],[object Object],[object Object]\' not found', 
I20170209-11:23:48.154(1)? details: undefined, 
I20170209-11:23:48.154(1)? message: 'Method \'[object Object],[object Object],[object Object],[object Object]\' not found [404]', 
I20170209-11:23:48.154(1)? errorType: 'Meteor.Error' } 

И я думаю, что это происходит из var calls = call(data).then .... // proceed from here, потому что getAllDataSource() помещает массив внутри data здесь. Мне нужно немного больше помощи, пожалуйста,

+1

вы уверены, что вы используете ** уаг Promise = требовать ('Блюберд'); **? – ymz

+0

@ymz ОК, это фактически решило ошибку! Но правильно ли код? Я имею в виду, что такое «Метеор» в каждом звонке? – Jerome

ответ

2

Так после попытки и попытки я сделал этот код:

new Promise(function(resolve) { 
    console.log("step1") 
    // 1. first async task 
    HTTP.call("GET", 'http://localhost:3000/api/datasources', { 
      headers: { 
       'Accept': 'application/json', 
       'Content-Type': 'application/json', 
       'Authorization': 'Bearer 123', 
      }, 
     }, 
     function(error, result) { 
      if (!error) { 
       allDataSources = result.data; 
       console.log("step1.5" + allDataSources) 
       resolve(allDataSources); 
      } else { 
       console.error(error); 
      } 
     }); 

}).then(function(allDataSources) { 
    console.log("step2") 
    // 2. second async task 
    return new Promise(function(resolve) { 
     console.log("step 2.5" + resolve + allDataSources) 
     for (var dataSource = 0; dataSource < allDataSources.length; dataSource++) { 
     sendme = "sendme"; 
     } 
     resolve(sendme); 
    }); 

}).then(function(sendme) { 
    // 3. now we can render the products after two async tasks are done 
    console.log('Rending product ' + sendme); 
}); 

Я хочу дать огромное спасибо @ymz, который помог мне

0

Этот вопрос является сложным, потому что это не удалось из 2 различных факторов

  1. неправильно ссылка на Promise
  2. неправильный подход при использовании кода асинхронной

Полный исправить:

Первое - использование требуется для Bluebird Promise lib:

var Promise = require('bluebird'); 

Второй - обрабатывать код асинхронной с обратным вызовом

function whenDataArrive(data) 
{ 
    if (!data) return; 

    var calls = call(data).then .... // proceed from here 
} 

getAllDataSources = Meteor.bindEnvironment(function(id){ 
HTTP.call("GET", 'http://localhost:3000/api/datasources', { 
     headers: { 
      'Accept': 'application/json', 
      'Content-Type': 'application/json', 
      'Authorization': 'Bearer 123', 
     }, 
    }, 
    function(error, result) { 
     if (!error) { 
      whenDataArrive(result.data); 
     } else { 
      console.error(error); 
      whenDataArrive(); 
     } 
    }); 

});

+0

Вы забыли указать 'call', и мне нужно закончить мой метод. Я буду отмечать это как ответ после завершения моего метода и протестировать его. Спасибо за помощь :) – Jerome

+0

[EDIT] Я думаю, что у вашего ответа что-то не так, посмотрите мою вторую редакцию. И последний вопрос, например, как мне сделать второй метод 'createDashboard'? Я имею в виду, я должен называть что-то вроде 'whenDataArrive'? Или как код знает, когда будет выполнена 'createDashboard'? – Jerome