使用RSVP.js承诺库运行多个JavaScript承诺

使用RSVP.js承诺库运行多个JavaScript承诺,javascript,promise,rsvp.js,Javascript,Promise,Rsvp.js,下面的简单演示JavaScript代码使用RSVP.js Promise库使用AJAX加载一些JSON数据,并在加载完所有JSON数据后在完成时触发一些代码 我想在JSON数据加载后扩展它,以实现更多承诺,这些承诺不是AJAX请求 例如,在加载JSON数据之后,我想创建另一个Promise,它将运行一个函数,该函数将设置一些DOM事件处理程序/侦听器 在设置事件处理的函数之后,我想在事件设置完成后运行其他一些函数 我是一个新手,学习承诺仍然存在,在某些情况下仍然在学习JavaScript,所以我

下面的简单演示JavaScript代码使用RSVP.js Promise库使用AJAX加载一些JSON数据,并在加载完所有JSON数据后在完成时触发一些代码

我想在JSON数据加载后扩展它,以实现更多承诺,这些承诺不是AJAX请求

例如,在加载JSON数据之后,我想创建另一个Promise,它将运行一个函数,该函数将设置一些DOM事件处理程序/侦听器

在设置事件处理的函数之后,我想在事件设置完成后运行其他一些函数

我是一个新手,学习承诺仍然存在,在某些情况下仍然在学习JavaScript,所以我需要一些帮助。如果您能在JSFIddle下面和上面提供一个扩展我的示例代码,我们将不胜感激

我相信,如果演示如何在我的演示中再添加1个承诺,那么我就可以在我的最终应用程序中添加所需的数量

下面是代码的JSFIDLE演示:





更新


我在这里更新了我的JSFIDLE演示,添加了一个新函数initdoEvents(),并将其添加到then(initdoEvents)调用中。我的控制台显示所有操作都按我希望的方式运行,但是由于某些原因,现在触发了我的错误

您使用RSVP的具体原因是什么?我会切换到jQuery承诺

var d = $.Deferred;

$.ajax({
 url: url,
 cache: true,
 dataType: 'json',
 success: function(data){
   d.resolve(data);
 },
 error: function(error){
   d.reject();
 }
});

$.when(d).then(function(data){
     //handle
});
我的控制台显示所有操作都按我希望的方式运行,但是由于某些原因,现在触发了我的错误

initdoEvents
函数中没有
resolve
reject
函数。它们仅作为
新RSVP.Promise(…)
回调的参数提供。尝试调用它们会抛出一个错误,该错误会被捕获并传播到错误处理程序(但它没有
.statusText
属性,因此只打印
未定义的

正如我在评论中所说的,如果你的函数没有做任何异步操作,那么就没有必要返回一个承诺。您只需从承诺回调中
返回一个值或
抛出一个异常。

如果您坚持围绕结果或拒绝创建承诺,则可以使用或函数来创建已履行/拒绝的承诺对象。

因为每个
。然后()
调用都会返回一个承诺,您可以将
。然后()
s链接到EOF。去吧@Bergi我读到一些关于它的信息,从上一个承诺返回的数据被传递到每个
then()
,我有点困惑,因为我不确定我是否想要它?我还一直准备好了异步函数调用的含义,在新函数中,我想初始化一堆事件,我的JSON数据已经加载,所以当我听到异步时,我认为AJAX不是100%确定我是否会为我的事件创建一个常规函数,并在其中调用
resolve()
…@Bergi…继续。。。。我的应用程序上有一些信息。它加载各种与项目管理相关的JSON数据。接下来,它为一个任务模式窗口加载一个任务JSON数据,在这个窗口中,我必须设置各种事件和库,比如日期选择器插件、里程碑的弹出窗口插件、分配的用户、标记处理等等。我只是想基本上使用承诺以特殊顺序执行此过程的每个部分,以便在其他部分加载之前不加载某些内容…@Bergi…继续…在我构建任务模式并添加到DOM之后的示例,有时我的Datepicker库在库完全加载之前运行时会抛出错误。请看一下。请注意,promise回调也可以是同步的,您不需要返回承诺(但是,如果您想等待一些东西,您可以)。“设置事件”听起来是同步的,“加载库”是异步的,应该返回一个承诺。我读过很多关于jQuery如何得到承诺错误的文章,在jQueryV3中,他们计划纠正并更改它们,使其更符合ES6,所以我不想使用一个坏的样式,只是为了在一年后不得不更改它。在使用RSVP.js之前,我使用了jQuery承诺。我还准备了很多评论,其中RSVP应该是最好的Promise库之一。当我使用jQuery Promises时,我实际上更喜欢调用我自己的
d.resolve(data)就像你的演示一样,但是我一直被告知我不应该这样做,因为jQUery AJAX调用已经这样做了。它也可以在没有
d.resolve(data)
的情况下处理,并带有一些回调,比如
success:function(data){callback(data)},error:function(error){callback(data)}
。对于您在这里试图实现的目标,我看不出jQuery会给您带来任何问题。然而,我并没有真正回答您的问题:|。我现在也看到了我的许多非ajax类型的代码是如何在
then(函数(结果){/*非异步代码*/}中被简单地调用的
而不是它自己的承诺函数…我提到这一点是为了回应
函数不做任何事情异步没有必要返回承诺
我现在明白你的意思了,谢谢
// EXAMPLE USAGE DEMO
// usage loading JSON data with AJAX using Promises
var promises = {
    users: getJsonDataPromise('/echo/json/', 'users'),
    task: getJsonDataPromise('/echo/json/', 'task')
};


RSVP.hash(promises)
.then(function(results) {
  console.log('then() function ran on success of loading JSON data');
  console.log(results);
  console.log('results.users', results.users); // print the users JSON results
  console.log('results.task', results.task); // print the task JSON results

  // I want to create another Promise here which will run a function that creates a bunch of DOM Event handlers/listeners and in that function when it is done loading it should fire a success like the above does when JSON data is done loading
})
.finally(function(){
  console.log('finally() function ran on success and failure.... It is always ran!');
})
.catch(function(reason){
  console.log('[ERROR] REASON:',reason.statusText); //if any of the promises fails.
});
var d = $.Deferred;

$.ajax({
 url: url,
 cache: true,
 dataType: 'json',
 success: function(data){
   d.resolve(data);
 },
 error: function(error){
   d.reject();
 }
});

$.when(d).then(function(data){
     //handle
});