无法承诺使用外部函数

时间:2017-09-20 00:12:56

标签: javascript jquery asynchronous promise

我正试图围绕javascript承诺,因为我在我正在开发的项目中需要它们。我尝试了几件事,但从来没有让它起作用。

问题在于:

我有一个通过websockets连接到服务器的功能,抓取某些信息并将它们作为对象传递。 由于这是异步的,我需要等到这个过程结束后继续我得到的信息。

这是获取信息的全局功能:

function getInfos(par1, par2) {

    // Open Websocket connection, ask for infos and wait for Answer/Message.

    OnMessage: function (aEvent, aToken) {
        if (aToken == "JustAString") {

            // Does this work this way? I need to get the "aToken" to the "MyCalltoServer" Function that called this mess here
            return aToken;

           // Tried this to resolve the promise created in the other script.
            resolve(MyCallToServer);
        }
    }
}

这就是我尝试使用现有的getInfos函数创建一个承诺。

var promiseResolve, promiseReject;

var MyCallToServer = new Promise(function(resolve, reject){

promiseResolve = resolve;
promiseReject = reject;

getInfos(par1,par2);


});

MyCallToServer.then(function(){
    console.log("done");
    console.log(aToken);
})

长话短说 - 它根本不起作用。任何帮助是极大的赞赏。事情是我无法改变建设 getInfos函数,因为它已经复杂化了(300个案例用于不同的答案)。所以我想也许有办法 包括解决它的承诺?

非常感谢任何帮助!!!

2 个答案:

答案 0 :(得分:0)

不确定为什么getInfosOnMessage: function (aEvent, aToken) {} 范围内或为什么语法为

Promise

您可以从getInfos()来电返回aToken,将resolve()传递给.catch(),包含传递给function getInfos(par1, par2) { // Open Websocket connection, ask for infos and wait for Answer/Message. return new Promise(function(resolve, reject) { function OnMessage(aEvent, aToken) { if (aToken == "JustAString") { resolve(aToken); } }; OnMessage() }) } function MyCallToServer(par1, par1) { return getInfos(par1, par2) } function handleMyCallToServer(aToken) { console.log("done"); console.log(aToken); } function handleMyCallToServerErroir(err) { console.log("error"); console.err(err); } MyCallToServer(1, 2) .then(handleMyCallToServer) .catch(handleMyCallToServerError) 的错误处理功能

from mpi4py import MPI
import sys
import subprocess

mpi_warn_on_fork = 0

size = MPI.COMM_WORLD.Get_size()
rank = MPI.COMM_WORLD.Get_rank()
name = MPI.Get_processor_name()

for i in range(size):
  if rank == i:
    command = "python hello.py %d %d %s" % (rank, size, name)
    subprocess.call("command", shell = True)

答案 1 :(得分:0)

承诺无法重复使用。从可以多次调用的参数化函数创建要解析/拒绝的全局promise变量等同于设置不可重入的异步代码。不要去那里。

提供异步数据的一种经典方法是使用带有两个参数的回调函数,其中一个参数根据操作的最终结果设置:

 function getInfos( par1, par2, callBack) {

     //  in asynchronous code that successfully delivers dataObject 

          callBack( false, dataObject); // valid data
          return; // from asynchronous service code

     //  in asynchronous code that detected an error

          callBack( error) // no valid data
          return; // from asynchronous service code

  }

使用回调函数调用:

  function callBack( err, data) {
      if( err) {
      //   the bad news
      }
      if( data) {
      // the good news.
      }
  }

或者,您可以通过返回在网络操作发生后已解决或拒绝的待处理承诺来宣传getInfos。这可以通过将所有代码(for getInfos)放在ES6 promise executor函数中来实现,该函数在promise构造期间被称为 synchronized

function getInfos( par1, par2) {
    return new Promise( function(resolve, reject) {
        // initiate getInfos things with supplied par1, par2 values

        // in asynchronous code that successfully created dataObject

             resolve( dataObject);
             return; // from asynchronous service code

        // in asynchronous code that failed
             reject( new Error( "error text");
             return; // from asynchronous service code
    });
}

有些库通过总是返回一个promise(不需要使用)来提供这两种机制,除了有条件地调用一个回调(如果提供了一个)。我建议在这种情况下简单地宣传getInfos

<小时/> 编辑。注释中的代码使用各种解构的promise对象组件和变量复制JQuery“deferred”对象。这是我不建议追求的kludge。

更简单的解决方案是首先修改getInfos以返回承诺,然后替换

$(document).ready(function() {
    var promiseResolve, promiseReject;
    var FunctionThatCallsServerFunction = new Promise(function(resolve, reject) {
       promiseResolve = resolve;
       promiseReject = reject;
       getInfos(par1,par2);
    });
    FunctionThatCallsServerFunction.then(function() {
        console.log("done"); // aToken should be received from the ServerFunction
        console.log(aToken);
    })
})

$(document).ready( function() {
    getInfos( par1, par2)
    .then(function( aToken) {
        console.log("done");
        console.log(aToken);
    })
    .catch( function( err) {
        console.log("An error occurred: ");
        console.log( err);
    });
})

直接使用getInfos返回的承诺。注意

  • 用于履行承诺的值作为参数值传递给.then提供的履行处理程序,并且
  • 通常包含一个catch子句,以避免Promise软件在发生错误时抛出“未处理的promise promise”异常。