2017-02-09 8 views
2

私は約束を築きましたが、私はちょっと立ち往生しています。Meteorの約束を使って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); 
}); 

しかし、私は最初のVAR 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に進みますか? [EDIT2] した後、私はこのエラーを得た@ymzの答えを続い

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' } 

は助け

[EDIT]これは実際にコンソール上で私のことを与えていただき、ありがとうございます

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' } 

getAllDataSource()dataの中に配列を入れているので、var calls = call(data).then .... // proceed from hereから来ると思います。私はもう少し助けを必要としてください

+1

あなたは** VARの約束を使用していることを確認しています= require( 'bluebird'); **? – ymz

+0

@ymz okこれは実際にエラーを解決しました!しかし、コードは正しいですか?私は、それぞれの呼び出しで 'メテオ 'は何ですか? – 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

それは

完全に非同期コードをPromise

  • 間違ったアプローチのための
  • 間違っ参照使用している間に起因して2つの異なる要因

    に失敗したので、この質問は注意が必要です修正:

    最初に使用する必要がありますブルーバードプロミス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

    [編集]あなたの答えは何か間違っていると思う私の2番目の編集を見てください。最後の質問です。例えば、私の2番目のメソッド 'createDashboard'はどうすればいいですか?私は 'whenDataArrive'のようなものを呼び出す必要があるのですか?あるいは、 'createDashboard'がいつ行われるのかをコードがどのように知っていますか? – Jerome

    関連する問題