2016-04-19 11 views
0

私は、Node.JSボットにpubchem-accessモジュールを使用して化合物の特定の化学的特性を取得し、テレグラムに送信しています。いくつかのプロパティを組み合わせてCAS識別子も取得したいが、CAS識別子を取得することは別の機能である(http://mmmalik.github.io/pubchem-access/#request参照)。 私はちょうどお互いの後に所望の機能を置くことによって一つのメッセージに両方を組み合わせることを試みている:両方の機能が完了する前にメッセージが送信されます

これを行うとき、私は何を得る
  case 'prop': 
      var cas = "" 
      pubchem 
       .setName(commandText) 
       .getCas() 
       .execute(function(data, status) { 
        if (status != 1) { 
         cas = status; 
        } else { 
         cas = data 
        } 
       }); 


      pubchem 

       .setName(commandText) 
       .getProperties(["IUPACName", "MolecularWeight", "MolecularFormula", 
        "CanonicalSMILES" 
       ]) 
       .execute(function(data) { 
        msg.answer(
         "IUPAC name: " + data.IUPACName + ",\nCAS :" + cas + 
         ",\nMW: " + data.MolecularWeight.toFixed(2) + ",\nFormula: " + data.MolecularFormula + 
         ", \nSMILES: " + data.CanonicalSMILES); 
       }); 

      break; 

は、他の人が持っていながら、時にはCASプロパティはまだ見つかっていないということです、メッセージがCASなしで送信されることがあります。

希望のプロパティがすべて取得された後にメッセージが送信されるようにするにはどうすればよいですか?

私はあなたが関数内で第2の要求をラップし、executeのコールバック関数が

pubchem 
.setName(commandText) 
.getCas() 
.execute(function(data, status) { 
    var cas = !Object.is(status,1) ? status : data; 
    doSecondRequest(cas); 
}); 

function doSecondRequest(cas){ 
    pubchem 
    .setName(commandText) 
    .getProperties(["IUPACName", "MolecularWeight", "MolecularFormula","CanonicalSMILES"]) 
    .execute(function(data) { 
     msg.answer(
      "IUPAC name: " + data.IUPACName + ",\nCAS :" + cas + 
      ",\nMW: " + data.MolecularWeight.toFixed(2) + ",\nFormula: " + data.MolecularFormula + 
      ", \nSMILES: " + data.CanonicalSMILES); 
     }); 
} 

または処理するためにpromisesを使用して呼び出されたときにそれを呼び出すことができ、コードのレイアウト

答えて

1

とのトラブルを抱えている申し訳ありません非同期呼び出し

var promise = new Promise((resolve) => { 
    pubchem 
    .setName(commandText) 
    .getCas() 
    .execute((data, status) => { 
     var cas = !Object.is(status,1) ? status : data; 
     resolve(cas); 
    }); 
}; 

promise.then((cas) => { 
    pubchem 
    .setName(commandText) 
    .getProperties(["IUPACName", "MolecularWeight", "MolecularFormula","CanonicalSMILES"]) 
    .execute((data) => { 
     msg.answer(
      "IUPAC name: " + data.IUPACName + ",\nCAS :" + cas + 
      ",\nMW: " + data.MolecularWeight.toFixed(2) + ",\nFormula: " + data.MolecularFormula + 
      ", \nSMILES: " + data.CanonicalSMILES); 
    }); 
}); 
+0

ありがとう、両方のオプションは完全に動作します。私はそれが非同期と関係があることを知っていましたが、私はPromiseのことを聞いたことがないので、私はそれについてお読みになります。 – bdbdbd

関連する問題