Asynchronous 如何在typeahead/bloodhound中异步设置请求头
环境:Asynchronous 如何在typeahead/bloodhound中异步设置请求头,asynchronous,synchronization,typeahead.js,bloodhound,Asynchronous,Synchronization,Typeahead.js,Bloodhound,环境: 我正在我的移动应用程序(类固醇/科尔多瓦)中使用typeahead/Hound搜索字段 从我的应用程序到API的每个请求都需要签名,并将签名添加到auth头中 显然,在ajax设置中设置头文件是不可行的,因为侦探犬发送的每个请求都是不同的,并且需要不同的签名 在我的第一个实现中,我使用beforeSendajax设置来实现这一点。只需计算该函数中的签名并将其添加到请求头中 然而,这不是很安全,所以我决定将使用的秘密和签名计算放入Cordova自定义插件的本机代码中进行编译。不是防弹的
- 我正在我的移动应用程序(类固醇/科尔多瓦)中使用typeahead/Hound搜索字段
- 从我的应用程序到API的每个请求都需要签名,并将签名添加到auth头中
beforeSend
ajax设置来实现这一点。只需计算该函数中的签名并将其添加到请求头中
然而,这不是很安全,所以我决定将使用的秘密和签名计算放入Cordova自定义插件的本机代码中进行编译。不是防弹的,而是相当安全的
由于Cordova插件是异步的,beforeSend
在这种情况下变得无用。该函数将在完成标头的签名和设置之前完成
总之,问题是:如何使用typeahead/bloodhound异步计算和设置这些标题?好的,解决方案似乎是fork和hack。首先修改
\u getFromRemote
,通过添加一个类似于remote.replace的remote.headers
选项,删除发送前对的需要,除非它返回一个延迟对象
if (this.remote.headers) {
$.when(
this.remote.headers(url, query, this.remote.ajax)
).done(function(headers) {
that.remote.ajax.headers = headers;
deferred.resolve(that.transport.get(url, that.remote.ajax, handleRemoteResponse));
});
} else {
deferred.resolve(this.transport.get(url, this.remote.ajax, handleRemoteResponse));
}
然后修改get函数,该函数使用它来处理延迟
if (matches.length < this.limit && this.transport) {
cacheHitPromise = this._getFromRemote(query, returnRemoteMatches);
cacheHitPromise.done(function(hit) {
if (!hit) {
(matches.length > 0 || !this.transport) && cb && cb(matches);
}
});
}
if(matches.length0 | |!this.transport)和&cb&&cb(matches);
}
});
}
现在我可以自由地使用异步本机代码来签名和设置请求验证头:)。虽然那里的人也没有提供任何有用的东西。在我的例子中,我并不特别关心解决方案可能出现在哪里(ajax或Hound),只是一些可行的方法。如果beforeSend可以返回一个承诺,那么这将非常简单:/。这里有一个被接受的答案,但这是一个非常棘手的问题。我认为我更愿意用fork和hack来破解《猎犬》,然后在我的代码中加入这种变通方法:/这似乎在ajax选项中是不可能做到的,所以如果typeahead支持除了向下投票之外没有其他答案,那么看起来这一定是一个猎犬破解。非常后悔我决定使用typeahead/Hound。