You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用openModal函数时如何获取'success'而非'undefined'?

问题分析

你的问题核心在于异步操作的返回值处理:

  • openModal函数执行时,只是完成了按钮的显示和点击事件绑定,本身没有返回任何值,所以直接调用console.log(openModal(1,2,3))会输出undefined。
  • 点击按钮的回调函数里的return deleteImg(...),只是这个回调函数的返回值,并不会传递给openModal的调用者——因为按钮点击是用户后续触发的异步行为,不是同步执行的代码。
  • 你尝试的$.when()方法无效,是因为$('#button').on('click')并不是一个Deferred/Promise对象,$.when()会立刻执行done回调,此时status还没有被赋值。
解决方案:用Promise封装异步事件

我们可以用Promise来封装按钮点击的异步行为,让openModal返回一个Promise对象,当按钮被点击时,resolve这个Promise并传入deleteImg的返回值。这样调用者就能通过.then()获取到结果。

修改后的代码如下:

JavaScript代码

function deleteImg(model, name, id) { 
  return 'success'; 
}

function openModal(model, name, id){
  $('#button').show();
  // 返回一个Promise,封装点击事件的异步结果
  return new Promise((resolve) => {
    // 用one()确保按钮只触发一次,避免重复resolve
    $('#button').one('click', function() {
      const result = deleteImg(model, name, id);
      resolve(result);
      // 可选:点击后隐藏按钮,防止重复操作
      $(this).hide();
    });
  });
}

// 正确的调用方式:通过.then()获取异步结果
openModal(1,2,3).then(result => {
  console.log(result); // 点击按钮后会输出'success'
});

可选:用jQuery Deferred实现(兼容旧版本jQuery)

如果你更习惯使用jQuery的Deferred对象,也可以这样改写:

function deleteImg(model, name, id) { 
  return 'success'; 
}

function openModal(model, name, id){
  $('#button').show();
  const deferred = $.Deferred();
  $('#button').one('click', function() {
    const result = deleteImg(model, name, id);
    deferred.resolve(result);
    $(this).hide();
  });
  return deferred.promise();
}

// 调用方式
openModal(1,2,3).done(result => {
  console.log(result);
});
关键知识点总结
  • 同步函数的返回值可以直接获取,但异步事件(比如用户点击)的结果必须通过回调、Promise或Deferred来传递。
  • 事件回调里的return值不会向上传递到外层函数的调用者,因为事件触发是在函数执行完毕之后发生的。

内容的提问来源于stack exchange,提问作者Michael Eugene Yuen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 03:54:22