2017-08-10 2 views
1

この関数を同期して実行します。私のアプリケーションでは、 は、それが他のデータに割り当てられる前に供給源を作成する必要があります。 そして、このタスクが完了した場合にのみ、アプリケーションはさらに進んでください。 それ以外のデータが作成され、SupplySourceIdが見つからない(undefinded)ため、失敗します。この関数をnode.jsで同期的に実行するには

ここで私は、同期機能を開始します。

var articleSupplySourceId = processSupplySource(); 

機能ProcessSupplySource(processSupplySourceを()):

function processSupplySource(){ 
var postJson2 = {}; 
postJson2.articleNumber = entry['part-no']; 
postJson2.name = entry['part-no']; 
postJson2.taxName = 'Vorsteuer'; 
postJson2.unitName = 'stk'; 
postJson2.supplierNumber = "1002"; 
postJson2.articlePrices = []; 
var articlePrices = {}; 
articlePrices.currencyName = 'GBP'; 
articlePrices.price = entry['ek-preisgbp']; 
articlePrices.priceScaleType = 'SCALE_FROM'; 
articlePrices.priceScaleValue = '1'; 
postJson2.articlePrices.push(articlePrices); 

return postSupplySource(postJson2); 

機能PostSupplySource

function postSupplySource(postJson2) { 

rp({ 
method: 'POST', 
url: url + '/webapp/api/v1/articleSupplySource', 
auth: { 
    user: '*', 
    password: pwd 
}, 
body: postJson2, 
json: true 
}).then(function (parsedBody) { 
    console.log('FinishArticleSupplySource'); 
      var r1 = JSON.parse(parsedBody); 
      console.log(r1.id); 
      return r1.id; 
}) 
.catch(function (err) { 
    console.log('errArticleSupplySource'); 
    console.log(err.error); 
    // POST failed... 
}); 
} 
+1

コールバックまたは約束について読む – yBrodsky

+0

することはできません。そして、あなたはすべきではありません。あなたは簡単にそれを非同期かつ*順次実行することができます。 – Bergi

答えて

0

あなたは非同期/のawait使用することができますあなたが探している同期動作を得るためにノード8を使用している場合。

そうでない場合は、deasyncのようなライブラリを使用して、投稿が完了してIDを返すまで待つ必要があります。

+0

モジュールのデアシンクがよく見えます。 あなたはそれについてもっと知っていますか?そのアプローチで私を助けることができますか? – labo28

-1

約束しておいたpostSupplySource関数をラップし、解決されたら他の関数​​を呼び出すことができます。これにより、他の関数を実行するときに `sourceSupplyId 'を確実に得ることができます。エラーの場合を除きます。このような何か:

function postSupplySource(postJson2) { 
    return new Promise(resolve, reject){ //**added 
    rp({ 
    method: 'POST', 
    url: url + '/webapp/api/v1/articleSupplySource', 
    auth: { 
     user: '*', 
     password: pwd 
    }, 
    body: postJson2, 
    json: true 
    }).then(function (parsedBody) { 
     console.log('FinishArticleSupplySource'); 
       var r1 = JSON.parse(parsedBody); 
       console.log(r1.id); 
       resolve(r1.id); // ** added 
    }) 
    .catch(function (err) { 
     console.log('errArticleSupplySource'); 
     console.log(err.error); 
     return reject(err); //*** added 
     // POST failed... 
    }); 
}); 
    } 

そして、あなたはこのようにその中に他の関数を呼び出すことができます。私は右のあなたの質問を得た

postSupplySource(postJson2) 
.then((supplySourceId) => { 
// supplySourceId is available. 
// you can call other functions here. 
}).catch((err) => { 
console.log(err); 
}); 

希望。

誰かが述べたように、asyc awaitを使用することができます。 として

+0

いいえ、コードを同期して実行するという約束をすることはできません。そして、いいえ、 'rp'はすでに約束を返しているので、[' Promise'コンストラクタの反パターンを避けてください(https://stackoverflow.com/q/23803743/1048572?What-is-the-promise-construction-antipattern-and-どのように回避するか)! – Bergi

+0

@Bergi私は彼が同期コードを実行する約束を使用できるとは言いませんでした。私はこれを行う別の方法を提案していました。あなたはそれについて最善の方法を示唆していますか?私もそのことから学びたいです。 – Mekicha

+0

多分あなたはそれを言うつもりはありませんでしたが、質問は "*この機能をnode.js *で同期的に実行するにはどうすればいいですか?"と答えています。 "*これを達成するために約束します*:" – Bergi

関連する問題