首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >JavaScript模式提供可选的回调接口,但在内部使用promise

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

Stack Overflow用户
提问于 2014-01-19 10:38:17
回答 2查看 671关注 0票数 0
代码语言:javascript
运行
复制
readConfig(path [, callback(err, config)])

这里的回调是可选的。如果调用时没有回调,函数将只使用同步方法(返回promises的readFile(path)configParser(string) )读取文件并直接返回解析后的配置对象。异常是直接抛出的。

有许多类似的代码来做同步和异步工作,所以我想使用一种方法来做这两种工作。promise之类的函数如何根据调用者的回调参数检测异步或同步调用?我们如何确保promise将以同步的方式运行?请给我看一下那个的式样。

EN

回答 2

Stack Overflow用户

发布于 2014-01-19 10:47:22

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

至于个人品味,我建议只有两个不同的功能,其中一个以Sync结尾,àla http://nodejs.org/api/fs.html。这个模块充满了函数对,其中一个是异步的,另一个不是。

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

代码语言:javascript
运行
复制
function notAsync(cb) {
  cb(null)
}

该回调在相同的节拍中执行。你需要把它包装成这样:

代码语言:javascript
运行
复制
function async(cb) {
  process.nextTick(function(){ cb(null)})
}

或者类似的东西。

无论你做什么决定,祝你编码愉快。

票数 1
EN

Stack Overflow用户

发布于 2014-01-19 10:47:42

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

解决方案应该是使用promise api的whenhttp://howtonode.org/promises

代码语言:javascript
运行
复制
$('#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!');
  });
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21212570

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档