JavaScript原生的Promise()没有回调[英] JavaScript native Promise() without callback

本文是小编为大家收集整理的关于JavaScript原生的Promise()没有回调的处理/解决方法,可以参考本文帮助大家快速定位并解决问题,中文翻译不准确的可切换到English标签页查看源文。

问题描述

查看此jQuery代码:

var promise = new Deferred(),
    some;

some = function(promise) {
    // do cool things

    promise.resolve();
};

promise.then(/*  callback cool things   */);

// init everything
some(promise);

我不确定这种方法的架构正确性,但是我很长一段时间都使用它,这对我来说很方便.

在本机JavaScript中,我无法使用这种方法.构造函数new Promise()需要一个回调参数,因此我不能将Promise的实例传递为参数.

所以我的问题是:如何预先定义JavaScript本机承诺,将其作为功能和解决方案的参数传递?

推荐答案

执行流将有所不同,但基本上以相同的方式工作:

function some(resolve, reject) {
    resolve();
}

var promise = new Promise(some);

promise.then(/*  callback cool things   */);

而不是some获得承诺本身,它将通过resolve和reject函数.因此,依赖性只是相反.

其他推荐答案

这是一个基本实现,可以保留您的应用程序流量.

不要在现实生活中使用它 - 您会错过抛出安全性(感谢提示的@BenjamingRuenbaum).

var MyDeferred = function() {
    var _resolve,
        _reject,
        capturedPromise = new Promise(function(resolve, reject){
            _resolve = resolve;
            _reject  = reject;
        });

    return {
        'resolve' : _resolve,
        'reject'  : _reject,
        'then'    : function() { capturedPromise.then.apply(capturedPromise, arguments); },
        'catch'   : function() { capturedPromise.catch.apply(capturedPromise, arguments); }
    }
};

本文地址:https://www.itbaoku.cn/post/627711.html

问题描述

Look at this jQuery code:

var promise = new Deferred(),
    some;

some = function(promise) {
    // do cool things

    promise.resolve();
};

promise.then(/*  callback cool things   */);

// init everything
some(promise);

I am not sure about architecture correctness of such approach, but I used it for long time and it is convenient for me.

In native JavaScript I can not use such approach. Constructor new Promise() requires a callback parameter, so I can not pass instance of Promise as a parameter.

So my question is: how can I predefine JavaScript native promise, pass it as a parameter to function and the resolve?

推荐答案

The execution flow would be a little different, but basically work the same way:

function some(resolve, reject) {
    resolve();
}

var promise = new Promise(some);

promise.then(/*  callback cool things   */);

Instead of some getting passed the promise itself, it gets passed the resolve and reject functions. So, the dependency is just the other way round.

其他推荐答案

Here's a basic implementation that would preserve your application flow as-is.

Do not use this in real life - you'd be missing out on throw safety (thanks to @BenjaminGruenbaum for the hint).

var MyDeferred = function() {
    var _resolve,
        _reject,
        capturedPromise = new Promise(function(resolve, reject){
            _resolve = resolve;
            _reject  = reject;
        });

    return {
        'resolve' : _resolve,
        'reject'  : _reject,
        'then'    : function() { capturedPromise.then.apply(capturedPromise, arguments); },
        'catch'   : function() { capturedPromise.catch.apply(capturedPromise, arguments); }
    }
};