jQuery的Promise对象能否与Ember.RSVP.Promise对象链式调用?

8

我需要帮助理解有关 Promise 的一些逻辑。以下是我想要实现的内容 - 使用 jQuery 进行 get 请求,然后将其与我的 promise 链接起来进行一些检查,我的代码如下:

http://jsbin.com/UVEpurU/1/edit

function checkInfoPromise(r) {
    var ok = true,
        promise = Ember.RSVP.Promise(function(resolve, reject) {
        if(ok) {
            return resolve(r);
        }
        else {
            return reject(r);
        }
        });
    return promise;
}

var requestPromise = $.get('/')
.then(function(r){
    return checkInfoPromise(r);
});

requestPromise.then(function(r) {
    console.log(r);
}).fail(function(r) {
    console.log('fail');
});

它不能按照我期望的工作。文档说它们应该能很好地协同工作,但它们不是这样,或者我的代码是错误的。

使用jQuery+jQuery相同的逻辑可以正常工作:

http://jsbin.com/AYeyaxO/1/edit

而Ember + Ember可以使用:

http://jsbin.com/iMUgiDo/1/edit


你的第一个例子对我有效 ;) - Renan Tomal Fernandes
它会在控制台中打印HTML吗?在我的情况下,它会打印一些JavaScript的东西。 - rsk
我的错,它打印的是 Promise 本身而不是 HTML D: - Renan Tomal Fernandes
1个回答

9

我认为这两种承诺的实现方式不能链接起来。你需要在Ember承诺中包装jQuery承诺。

var requestPromise = new Ember.RSVP.Promise(function(resolve, reject) {
    $.get("/", resolve).fail(reject);
});

JSBin:http://jsbin.com/Ikubiju/1/edit?html,js,console

这是一个JSBin链接,可以用来编辑和运行HTML、CSS和JavaScript代码。它非常适合于开发人员进行实验和测试。你可以在该链接中输入你的代码并立即看到结果。

澄清一下,查看 $.Deferred 的源代码 可以发现,它检查链式 Promise 的方式是检查是否为另一个带有 "promise" 方法的对象 - 因此它将无法识别 Ember.RSVP.Promise 对象。因此,不,您不能将两者链接在一起,就像我今天早上痛苦地发现的那样。 - Elte Hupkes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接