无法找到变量:Safari上的Promise

时间:2014-03-17 18:26:53

标签: javascript ios ember.js safari

我有一个我正在开发的网站,可以在Chrome桌面上完美运行(Windows 8.1和OS X Mavericks)

当我在iOS 7或Safari 7.0.2上运行它时,控制台出现错误,指出加载路径时出错:checkIfLoggedIn'

它在消息中指定的成员不是路由,它是一个返回promise的方法。当我通过ember代码进行调试以找出问题所在时,我发现它拒绝承诺的原因是“找不到变量:承诺”

我不能在这里发布我网站上的实际代码,所以我开始创建一个重现错误的小提琴,我能够想出这个:

http://jsfiddle.net/NQKvy/851/

这适用于桌面版Chrome(Windows 8.1和OS X Mavericks),但在iOS 7或Safari 7.0.2上会向控制台抛出以下错误:ReferenceError:找不到变量:Promise'

任何人都有任何想法,为什么这不起作用?

回顾一下:

  • 我在Chrome for Windows 8.1和OS X Mavericks上进行了测试 - 它正常运行
  • 我已在Chrome for iOS上测试过它无效
  • 我已在Safari for iOS和OS X Mavericks上测试过,但它无法正常工作
  • 我根本没有在Android上测试过(我目前无法访问任何设备)

这让我相信这是一个Safari错误(如果我没记错的话)Chrome for iOS使用Safari控件来渲染页面而不是Chromium

这是我用来生成错误的代码:

App.ready = function() {
    var asdf = new Promise(function (resolve) {   
        var i = 1;
        i++;
        resolve.call(this,i);
    }).then(function (result) {
        alert('I: ' + result);
    });
};

2 个答案:

答案 0 :(得分:14)

事实证明,在Safari上,您必须在创建承诺时使用完全限定名称,否则它将无效:

App.ready = function() {
    var asdf = new Ember.RSVP.Promise(function (resolve) {   
        var i = 1;
        i++;
        resolve.call(this,i);
    }).then(function (result) {
        alert('I: ' + result);
    });
};

注意'new Ember.RSVP.Promise'而不是'new Promise'。这似乎可以解决它。

答案 1 :(得分:1)

根据this,iOS Safari 7.1或Safari 7没有承诺。

但是,他们将在iOS Safari 8和Safari 8中获取它们。