当前位置: 首页 > 知识库问答 >
问题:

JavaScript模式提供可选的回调接口,但在内部使用promise

王云
2023-03-14

我想创建一个函数,比如一个readConfig函数。

readConfig(path [, callback(err, config)])

这里的回调是可选的。如果调用时没有回调,函数将只使用同步方法(readFile(path)confiParser(string)返回promise)读取文件并直接返回解析的config对象。异常直接抛出。然而,当提供回调时,函数将使用异步方法,并在完成后调用回调。异常直接引发到回调,但不抛出。

有许多类似的代码来执行同步和异步工作,所以我想使用一种方法来实现这两种工作。类似promise的函数如何根据调用方的回调参数检测异步或同步调用?我们如何确保promise以同步的方式行动?请给我看一个图案。

共有2个答案

应志用
2023-03-14

在本例中,我使用jQuery的延迟api。我将回调包装在.when中,它允许您将.then()附加到回调,无论它是同步的还是异步的。

解决方案应该是在时使用promise api的。http://howtonode.org/promises

现场演示(单击)。

$('#sync').click(function() {
  foo(function() {

  });
});
$('#async').click(function() {
  foo(function() {
    var deferred = new $.Deferred();

    setTimeout(function() {
      deferred.resolve();
    }, 500);

    return deferred.promise();
  });
});

function foo(callback) {
  $.when(callback()).then(function() {
    console.log('done!');
  });
}

祖波光
2023-03-14

我不能说以同步的方式执行的promise,但是在JavaScript中,您可以执行arguments.length来获取传递给函数的参数数。如果等于2和typeof参数[1] === '函数,那么您有第二个参数是一个函数。

至于个人喜好,我建议只使用两种不同的功能,其中一种以Sync结尾,即lahttp://nodejs.org/api/fs.html. 这个模块充满了函数对,其中一个是异步的,另一个不是。

另外,请记住,这不是异步代码:

function notAsync(cb) {
  cb(null)
}

该回调在同一时间执行。您需要这样包装它:

function async(cb) {
  process.nextTick(function(){ cb(null)})
}

或者类似的东西。

无论你决定什么,快乐编码。

 类似资料:
  • 我创建了一个接口,以便可以在对话和片段之间进行通信。 目标:当用户从对话框中选择任何内容时,应将其显示在文本视图中。 在这个界面中,我创建了一个界面方法,在主活动中调用,并传递用户在对话框中选择的值。与用户选择的值一起,在我的片段中,我创建了一个方法,将文本视图设置为该值。然而,每当我调用该方法时,它总是返回null。 我对日志进行了大量测试,发现通过我的方法传递的值不是空的,一切似乎都按照我想要

  • 我试图在定义它的接口中调用一个事件(请参见下面的代码)。但是,我得到了以下错误:的左侧 我怀疑这可能与接口中声明的所有事件都始终是属性有关。这是一个bug、一个特性吗?有什么解决方法吗? 谢谢。

  • 问题内容: 使用此处提到的示例,如何使用JavaScript而不是单击按钮来调用模式窗口? 我是AngularJS的新手,并尝试在这里和这里搜索文档,但是没有运气。 谢谢 问题答案: 好的,因此,首先http://angular-ui.github.io/bootstrap/有一个指令和服务,这两个指令都可以用来打开模式窗口。 与众不同的是,使用模式的指令内容嵌入在宿主模板中(一个触发模式窗口打开

  • 和包中的和函数接口分别具有以下签名- 是否有一些特定的用例,其中每一个都比另一个更适合?

  • 我创建了提供应用程序上下文的模块,我希望在模型层获得上下文。 我在Presenter层注入上下文,它使用,但是当我移到模型层时,Dagger在变量上注入一个值。 注入 主模块

  • 有些接口没有被开放,但是也想要通过网关来访问,SOP提供一个固定的请求格式来访问。 请求格式: http://ip:port/rest/服务id/your_path,其中http://ip:port/rest/为固定部分,后面跟微服务请求路径。 下面是一个微服务的接口例子 @RestController @RequestMapping("food") public class Traditiona