Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asynchronous 如何在typeahead/bloodhound中异步设置请求头_Asynchronous_Synchronization_Typeahead.js_Bloodhound - Fatal编程技术网

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头中
显然,在ajax设置中设置头文件是不可行的,因为侦探犬发送的每个请求都是不同的,并且需要不同的签名

在我的第一个实现中,我使用
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。