- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我们的应用程序正在不断增长,我们的客户端脚本需要重构,以变得更干净、更精简、更易于维护。我正在尝试使用一个小模块来利用 Q 库进行 promise 链接。
正如您所看到的,我需要将一些返回值从初始函数传递回 promise 链的其余部分。有人可以帮助我理解我需要做什么才能让第一个函数作为 Promise 正确返回吗?然后解释一下链条?
这是我的出发点:
var promise = new Q.Promise(generateMoveRequest)
.then(function (id) {
var woNum = 12345;
return layoutInit(woNum, id, true);
}).then(function (result) {
if (result) {
return moveRequestInit(result, true);
} else {
throw new Error('Template not loaded');
}
}).catch(function (err) {
console.log(err);
});
生成移动请求:
generateMoveRequest: function () {
$.ajax({
method: "GET",
url: window.contextPath + '/api/settings/getjson',
data: {name: "the_name"},
success: function (data) {
if (data.length) {
var id = $.parseJSON(data).Parent;
return id;
}
},
error: function (xhr, textStatus, errorThrown) {
console.log("xhr: ", xhr);
return null;
}
});
}
布局初始化:
layoutInit: function (num, id, appendLayout) {
$.ajax({
method: "GET",
url: window.contextPath + '/some/url',
data: {num: num, id: id},
success: function (data) {
return layoutInit.callback(data, appendLayout);
},
error: function (xhr, textStatus, errorThrown) {
console.log("xhr: ", xhr);
}
});
},
callback: function (data, appendLayout) {
if (data && data.toString().toLowerCase() !== "blank") {
if (appendLayout) {
$(data).insertBefore($("#detailsection"));
} else {
$("#detailsection").html(data);
}
} else {
$("#detailsection").html('');
}
},
generateMoveRequest 函数将执行,但链永远不会继续进行。没有 .then() 执行,并且 layoutInit 永远不会被调用。
我正在使用 Q 库,但一些示例似乎忽略了如何启动/创建 Promise 或将初始函数转换为 Promise。
有人可以解释我这里的错误或为我提供一个干净的例子吗?
最佳答案
promise 的 jQuery 实现不遵循 A+ 标准,因此您最好使用 Q。
promise 必须接收一个带有 2 个参数的函数 - resolve
和 reject
- 它们也是函数(请记住 Javascript 是一种函数式语言)。成功时必须调用 resolve
函数,出错时必须调用 reject
函数。无论您传递给这些函数的是什么,都可以在 then()
和 catch()
回调中使用。
长话短说,重写你的代码如下:
var generateMoveRequest = function (resolve, reject) {
$.ajax({
method: "GET",
url: window.contextPath + '/api/settings/getjson',
data: {name: "the_name"},
success: function (data) {
if (data.length) {
var id = $.parseJSON(data).Parent;
resolve(id);
} else {
reject({message: 'Data not received'})
}
},
error: function (xhr, textStatus, errorThrown) {
reject({message: errorThrown})
}
});
}
var promise = new Q.Promise(generateMoveRequest)
.then(function (id) {
var woNum = 12345;
return layoutInit(woNum, id, true);
}).then(function (result) {
if (result) {
return moveRequestInit(result, true);
} else {
throw new Error('Template not loaded');
}
}).catch(function (error) {
console.log(error.message)
});
稍后编辑 - 请参阅代码片段以了解 Promise 的工作原理:
// any number of params
function willPerformAnAsyncOperationAndReturnAPromise(firstParam, secondParam, thirdParam) {
var promise = new Q.Promise(function (resolve, reject) { // always resolve & reject
// perform an async operation, like waiting one second
window.setTimeout(function () {
if (firstParam !== 0) {
// if the 1st param is not 0, it's a success
resolve ({
first: firstParam,
second: secondParam,
third: thirdParam
})
} else {
reject({message: 'The first param must not be null'})
}
}, 1000)
})
return promise
}
willPerformAnAsyncOperationAndReturnAPromise(1, 2, 3)
.then(function (data) {
console.log(data)
})
.catch(function (error) {
console.log(error)
})
willPerformAnAsyncOperationAndReturnAPromise(0, 2, 3)
.then(function (data) {
console.log(data)
})
.catch(function (error) {
console.log(error)
})
关于javascript - 如何转换为使用 Promises 和 Q Library,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43193345/
我看过有关 CocoaPods 的指南,建议像这样导入所需的 pod 的库 header : #import 在哪里Library是库的名称(例如 #import )。 我还看到指南建议像这样导入
我正在尝试创建一个包含其他库的 PHP 库,我敢打赌我遗漏了一些基本的东西。 使用 AWS PHP SDK作为指南,我想创建一个库,在使用 Composer 安装后,它需要其他库,但是类的整个范围(包
我正在为 Android 产品开发我的 gradle 版本,以使产品风格正常工作。 我有以下项目结构: at.mkw.inlocs.android - Library Project at.mkw.i
使用@testing-library/react-hooks 我过去常常通过initialProps 传递模拟存储,正如Advanced Hooks 中提到的那样文档。假设我有一个代码: import
我试图获得一个静态链接到我的程序的音频库。我用 this灵活的包。为了让它运行,我必须按照描述构建 soloud 库 here .下载后不久,我在“build”文件夹中运行了“genie --with
我刚刚安装了 zkcm library在我的 kubuntu 机器上,我在编译 C++ 代码时遇到了问题。 我已经安装了 gmp 和 mpfr 库并检查它们是否工作;代码 mpfr_t m1, m2,
我正在尝试编译我的 native 代码。这是我的 android.mk 文件 //part1-static lib LOCAL_PATH := $(call my-dir) include $(CLE
我正在开发一个带有沙丘的大型图书馆。让我们调用这个库L . 为了避免造成大困惑,沙丘项目有许多较小的库:A , B , C , ... 这些库相互依赖。 我希望用户能够 opam install L
在 unix 之上使用 C 语言工作,我正在加载和使用共享库,如下所示: ... handle = dlopen("nameOfLib"); ... libInit(); ... libGoToSta
我试图找出一种更简单的方法来为XCode中的链接器构建阶段复制/同步框架列表。我知道我可以在Xcode中复制目标,但这是用于创建新的Cocoa Touch Unit Testing Bundle目标。
例如/lib/的描述是它包含系统的共享库文件。 图书馆到底是什么?我们谈论的库文件是否类似于在 C 中导入库?库文件中包含什么以及它们的用途是什么? 它与.dll 有什么关系 最佳答案 库只是一个代码
我有这样的目录结构 . --compile_c.sh --compile_java.sh --config.sh --execute_java.sh --run.sh --src --ccode
我正在更新一些 Makefile 以从 Make 3.81 移动到 3.82。在多个地方,原作者使用了类似这样的东西来构建静态库: all: lib$(library).a($objects) 这似乎
我是 Rust 的新手,正在尝试了解 Cargo 的东西。我在他们的常见问题解答中读到关于 "why do binaries have Cargo.lock in version control, b
我正在尝试使用 Microsoft Enterprise Library 中的 DatabaseFactory 方法。 using Microsoft.Practices.EnterpriseLibr
我刚刚升级到Xcode 5.1,突然出现一个新警告: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctool
然后新的Enterprise Library 6出来了,可以是downloaded here .我已将 EnterpriseLibrary6-binaries.exe 下载并解压缩到我的 C: 驱动器
我正在尝试将 native 库与我的 Eclipse 插件捆绑在一起。当我提供库的路径时 -Djava.library.path ,它完美无缺。 但是,当我将它添加到 MANIFEST.MF 中时文件
在我的 Android Studio 项目中,我有两个子项目/模块:一个 Android 应用程序(App1)和一个 Android 库项目(LibraryProject1)。 App1取决于 Lib
我最近使用 Google 的 Closure 编译器创建了一个 JavaScript 库:https://github.com/bvaughn/task-runner 我打算让这个库供那些也需要完整闭
我是一名优秀的程序员,十分优秀!