Javascript 回馈承诺

Javascript 回馈承诺,javascript,Javascript,问题陈述 我想上传一些图像时,用户下降到dropZone。我所做的是将它们上传到服务器,然后返回承诺,以执行进一步的操作,如隐藏dropZone、显示成功消息并将用户移动到下一步 var promise = new Promise(function(resolve, reject) { dropZone.addEventListener('drop', function(event) { /* ajax call */ resolve(value); })

问题陈述

我想上传一些图像时,用户下降到dropZone。我所做的是将它们上传到服务器,然后返回承诺,以执行进一步的操作,如隐藏dropZone、显示成功消息并将用户移动到下一步

var promise = new Promise(function(resolve, reject) {
    dropZone.addEventListener('drop', function(event) {
      /* ajax call */
      resolve(value);
    });
  });
我面临的问题是,如果用户两次删除文件,那么drop事件将触发两次,而promise将尝试解决已解决的promise


每次事件发生时,我都要返回一个新的承诺。

返回事件内部的承诺,如

dropZone.addEventListener('drop', function(event) {
   return new Promise(function(resolve, reject) {
     /* ajax call */
     resolve(value);
   });
});

如果您在函数中调用promise,请确保您没有频繁调用该函数,正如我看到的,如果您多次调用promise,drop
event
将在promise中重复创建。如果要多次调用函数,请删除事件侦听器并再次添加它

您可以简单地使用async/await进行ajax调用

  dropZone.addEventListener('drop', async function(event) {
    try {
       const response = await doFileUploadHere()
       return response;
    } catch(err) {
       console.log('error while uploading the files', err)
    }
  });

您不能为此使用承诺,因为承诺只能解决一次—重构您希望侦听此类事件的代码以侦听此类事件。问题不清楚。你知道文件总数吗?承诺不是这样的。Promise可用于了解所有文件何时完成,但在处理第一个文件时基本上可以通过设置状态禁用dropzone,并在Promise解析时切换回状态。我希望在每次事件触发时返回新的Promise。这是否回答了您的问题?完全正确:1)添加事件侦听器,2)仅当事件实际触发时3)创建承诺:)但是如何获得承诺?这类回调处理程序的返回值是否可以访问?你必须做出承诺,这就是为什么写了returnnewpromise…我认为你不理解我的观点。您如何可能在顶层(回调之外)访问返回的承诺?在回调中返回这样的值是没有意义的(除了少数情况,如
.map()
等),因为这些返回的值在其他地方变得不可访问。(特别是内部事件处理回调)通常返回内部事件处理程序用于指示事件是否已取消,而不是用于自定义值返回。