Javascript 回馈承诺
问题陈述 我想上传一些图像时,用户下降到dropZone。我所做的是将它们上传到服务器,然后返回承诺,以执行进一步的操作,如隐藏dropZone、显示成功消息并将用户移动到下一步Javascript 回馈承诺,javascript,Javascript,问题陈述 我想上传一些图像时,用户下降到dropZone。我所做的是将它们上传到服务器,然后返回承诺,以执行进一步的操作,如隐藏dropZone、显示成功消息并将用户移动到下一步 var promise = new Promise(function(resolve, reject) { dropZone.addEventListener('drop', function(event) { /* ajax call */ resolve(value); })
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()
等),因为这些返回的值在其他地方变得不可访问。(特别是内部事件处理回调)通常返回内部事件处理程序用于指示事件是否已取消,而不是用于自定义值返回。